#include <iostream>
#include <string>
#include <vector>
#include <assert.h>

using namespace std;

template<class K> struct AVLTreeNode 
{
    AVLTreeNode<K>* _left;
    AVLTreeNode<K>* _right;
    AVLTreeNode<K>* _parent;
    int _bc;
    K _data;

    AVLTreeNode(const K& data)
        :_left(nullptr)
         ,_right(nullptr)
         ,_parent(nullptr)
         ,_bc(0)
         ,_data(data)
    {}
};

template<class K> class AVLTree 
{
    typedef AVLTreeNode<K> Node;
public:
    bool insert(const K& data)
    {
        
    }

    bool erase(const K& data)
    {

    }

    Node* find(const K& data)
    {

    }

private:
    Node* _root = nullptr;
};
